package com.gxa.hualianeshop.controller;


import com.gxa.hualianeshop.common.base.RedisKeys;
import com.gxa.hualianeshop.common.base.ResultCode;
import com.gxa.hualianeshop.common.exception.BizException;
import com.gxa.hualianeshop.common.util.JwtUtil;
import com.gxa.hualianeshop.entity.pojo.Empl;
import com.gxa.hualianeshop.entity.vo.EmplTokenVO;
import com.gxa.hualianeshop.entity.vo.EmplVO;
import com.gxa.hualianeshop.service.EmplService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author bill
 * @date 2023/7/5 10:46
 */

@Slf4j
@RestController
@RequestMapping("/empl")
public class EmplController {

    @Autowired
    private EmplService emplService;

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * 在service模块中, 返回的数据不建议用R, 而是具体的数据
     * 当web服务远程调用的时候, 可以直接拿到数据本人
     * @return
     */
    @GetMapping("/list")
    public List<Empl> list(){
        return emplService.list();
    }

    @PostMapping("/login")
    public EmplTokenVO login(String phone,String pwd){

        //查询员工的基本信息
        Empl empl = emplService.login(phone, pwd);

        if(empl== null){
            throw new BizException(ResultCode.LOGIN_ERROR);
        }

        // 构建一个带token的EmplTokenVO对象
        EmplTokenVO emplTokenVO = new EmplTokenVO();

        // 复制基本信息
        BeanUtils.copyProperties(empl,emplTokenVO);

        // 用jwt构建token
        // 过期时间: 不能过长不能过短
        // 过长: jwt中包含用户信息
        // 过短: 太短就需要重登录
        // 结论: 设定为15-30分钟为宜
        // TODO 如果过期后的续期,通过refreshtoken来达到续期的判断
        String token = JwtUtil.sign("phone", phone, 15 * 60 * 1000);
        emplTokenVO.setToken(token);
        return emplTokenVO;
    }

    @GetMapping("getPermsById")
    public EmplVO getPermsById(Integer id){

        //通过缓存来优化访问
        //1. 通过用户id/phone 去redis中判断是否存在
        // key: perms:1
        Boolean hasKey = redisTemplate.hasKey(RedisKeys.PERMS_KEY + id);

        // 绑定目标key
        BoundValueOperations<String, Object> boundValueOps = redisTemplate.boundValueOps(RedisKeys.PERMS_KEY + id);

        // 如果key存在
        if(hasKey!=null && hasKey){
            Object o = boundValueOps.get();
            log.info("o:"+o);

            // 如果读取权限信息完成,就把EmplVO 直接返回
            return (EmplVO)o;
        }

        // 如果key不存在,则表示缓存中还未建立数据,就需要读取数据库
        EmplVO emplVO = emplService.getEmplRoleMenuInfo(id);



        return emplVO;
    }

   /*
   直接放回EmplService 的操作
   @GetMapping("/getEmplService")
    public EmplService getEmplService(){
        return emplService;
    }*/




}
